ASP.NET MVC Controllers
Als voorbeeld van een ASP.NET MVC controller nemen we de HomeController
klasse in Controllers / HomeController.cs:
namespace LerenWerkenMetMVC.Controllers { public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } }
Controller Actions
Controller klassen zijn gewone .NET klasse. De methoden in de controller klassen - aangeduid als controller acties - handelen de request af. De termen controller en controller actie worden vaak door elkaar gebruikt. Dit komt omdat het MVC patroon maakt geen onderscheid maakt tussen de twee. Maar het ASP.NET MVC Framework is vooral bezig met controller acties, omdat ze de feitelijke logica bevatten om de requests te verwerken.
Bijvoorbeeld, de HomeController klasse van daarnet bevat drie acties:
- Index
- About
- Contact
Dus volgens het standaardroute patroon {controller} / {actie} / {id}
, wordt een request naar een URL/Home/About door het routing framework de About()
methode van de HomeController
klasse gestuurd die de request afhandelt.
De methode About()
is vrij eenvoudig: de methode geeft gegevens door aan de view via de eigenschap ViewBag
(daarover later meer), en vertelt het ASP.NET MVC framework om de view met naam "About" weer te geven door de methode view ()
op te roepen, die een ActionResult
van het type ViewResult
retourneert.
Action Results
Het is belangrijk in te zien dat het de taak van de controller is aan het ASP.NET MVC Framework vertellen wat de volgende stap moet zijn, maar niet hoe dat gedaan moet worden. Deze communicatie vindt plaats door middel van ActionResult's, de geretourneerde waarden van elke controller-actie. Bijvoorbeeld, wanneer een controller besluit om een weergave te openen, vertelt het aan het ASP.NET MVC framework om de view te tonen door het retourneren van een ViewResult
. De controller geeft de view niet zelf weer. Deze losse koppeling is een ander goed voorbeeld van het separation of concerns patroon in actie (wat te doen versus hoe het moet worden gedaan).
Elke controller-actie moet een ActionResult
retourneren maar je zal zelden handmatig een ActionResult
creëren. Je zal in de praktijk meestal een beroep doen op de helper methoden die de System.Web.Mvc.Controller
basisklasse biedt:
Content()
retoruneert een ContentResult
die om het even welke tekst weergeeft, bijvoorbeeld, "Hello World!"
File()
retoruneert een FileResult
dat de inhoud van een bestand weergeeft bijvoorbeeld, een PDF bestand
HttpNotFound()
retourneert een HttpNotFoundResult
die een 404 HTTP status code response weergeeft
JavaScript()
retoruneert een JavaScriptResult
die JavaScript weergeeft, bijvoorbeeld, "function hello() { alert( Hello, World! ); }
".
Json()
Returns a JsonResult
serialiseert een object en geeft in JavaScript Object Notation (JSON) formaat weer, bijvoorbeeld, "{ “Message”: Hello, World! }"
PartialView()
retourneert een PartialViewResult
die de inhoud van een view weergeeft zonder de lay-out
Redirect()
retourneert een RedirectResult
die een 302 (tijdelijke) status code weergeeft om de gebruiker om te leiden naar een bepaalde URL, bijvoorbeeld "302 http://www.modernways.com/books/recent
". Deze methode heeft aanverwante methode, RedirectPermanent()
, die ook resulteert in een RedirectResult
, maar gebruik maakt van HTTP-status code om een permanente redirect in plaats van een tijdelijke weer te geven
RedirectToAction()
en RedirectToRoute()
Werkt net als de Redirect()
helper, maar het framework bepaalt dynamisch de externe URL door de routing engine te bevragen. Net als de Redirect()
helper, hebben deze twee helpers ook permanente redirect varianten: RedirectToActionPermanent()
en RedirectToRoutePermanent()
.
View ()
retoruneert een ViewResult
die eeb view weergeeft
Action Parameters
Controller acties zijn eigenlijk methoden zoals een ander. Maar een controller action kan parameters opgeven die ingevuld worden door ASP.NET MVC die de waarden ophaalt uit de request. Deze functionaliteit heet model binding, en het is één van ASP.NET MVC's meest krachtige en handige functies.
Om model binding goed te begrijpen is het goed te kijken hoe de interactie met de request voordien gebeurde:
public ActionResult Create () { var book = new Book() { Title = Request["title"], CurrentPrice = Decimal.Parse(Request["currentPrice"]), Author = Request ["author"]), PurchaseDate = DateTime.Parse(Request["purchaseDate" ]), //... }; }
In het vorig voorbeeld worden de eigenschappen van het Book object ingesteld met waarden die rechtstreeks uit de request worden gehaald. In de request staan de waarden als string. Ze moeten dus eerst omgezet worden naar het juiste gegevensgevenstype van de eigenschappen in het Book object. En dat op een veilige manier zodat het programma niet vastloopt met bijvoorbeeld de TryParse
methode.
Model Binding
Met model binding moet je deze expliciete code niet meer zelf schrijven. De conversie, checken voor null waarden enz. wordt door het framework gedaan. Bijvoorbeeld, dezelfde controller actie als hierboven maar nu met behulp van model binding methode parameters:
public ActionResult Create ( string title , decimal currentPrice , string author, DateTime purchaseDate) { var auction = new Book() { Title = title, CurrentPrice = currentPrice, Author = author, PurchaseDate = purchaseDate; }; }
In plaats van de waarden op te halen uit de request, declareert de action ze als parameters. Wanneer het ASP.NET MVC framework deze methode uitvoert, wordt geprobeerd de parameters van de actie in te stellen met dezelfde waarden van het request zoals in het vorige voorbeeld.
Let erop dat alhoewel we de dictionary Request
niet rechtstreeks uitlezen, de parameternamen nog steeds erg belangrijk zijn. De namen van de parameters moeten overeenkomen met de waarden uit de request. Het object Request is niet de enige plek waar de ASP.NET MVC model binder haar waarden uit haalt, echter. Het framework zoekt op verschillende plaatsen, zoals:
- de routegegevens,
- query string parameters,
- form post de waarden en
- zelfs geserialiseerde JSON objecten.